package persistencia;

import java.sql.SQLException;
import java.util.Vector;

public class Basedatos {
	
	private static String bdnombre="Usuario";
	private static String url="jdbc:mysql://localhost/"+bdnombre;
    private static String usuario="iso2";
    private static String clave="claveiso2";
    private static String driver="com.mysql.jdbc.Driver";
    
    private static String [] attrUsuarios={"nombre","apellido1","apellido2",
    												"pass","direccion","localidad", "pais","id"};
    private static String [] attrAdmins={"nombre","pass","id"};
    
    
    private static String []admins={"Alberto","Eusebio","Jonathan","Mari Carmen"};
	private static String claveAdmins="claveiso2";

    private Agente agente;
   
    public Basedatos() throws Exception{
    	this(driver,url,usuario,clave);
    }
    public Basedatos(String driver,String url,String usuario,String clave) {
    	try {
			agente=Agente.getAgente(driver,url,usuario,clave);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    public void insertarEnTabla(String tabla,String []atributos){
    	
    	String SQL="insert into "+tabla+" values (";
    	int i;
    	for(i=0;i<atributos.length-1;i++){
    		SQL+=atributos[i]==null?"null)":"'"+atributos[i]+"',";
    	}
    	
    	SQL+= atributos[i]==null?"null)":"'"+atributos[i]+"')";
    	agente.ejecutar(SQL);
    }     
    public void insertarUsuario(String []atributos){
    	insertarEnTabla("usuarios",atributos);
    }
    
    public void insertarAdmins(String []atributos){
    	insertarEnTabla("admins",atributos);
    }
              
    public void eliminarUsuario(String usuario){        
    	String SQL="delete from usuarios where nombre='"+usuario+"'";
    	agente.ejecutar(SQL);
    }
    
    public boolean esAdmin(String nombre){
    	return listarAdmin(nombre)!=null;
    }
    
    
    public void actualizarUsuario(String usuario,String []atributos){
    	Vector <String> atributosViejos=listarUsuario(usuario);
    	eliminarUsuario(usuario);
    	
    	insertarUsuario(combinar(VectoraArreglo(atributosViejos),atributos));   	
    }
    
    private String[] combinar(String [] fin,String []inicio){
    	for(int i=0;i<inicio.length;i++){
    		
    		if(inicio[i]!=null){
    			fin[i]=inicio[i];
    		}
    	}
    	return fin;
    	
    }
    
    
    
    private String[] VectoraArreglo(Vector<String> v){
    	String []resultado=new String[v.size()];
    	
    	for(int i=0;i<v.size();i++){
    		resultado[i]=v.get(i);
    	}    	

    	return resultado;
    }
    
    
    public Vector listarUsuarios(String columnas[]){
    	return listarVector("usuarios",columnas);
    }
    
    public Vector listarUsuario(String nombre){
    	return listarElemento(nombre,"usuarios",attrUsuarios);
    }
    
    public Vector listarAdmin(String nombre){
    	return listarElemento(nombre,"admins",attrAdmins);
    }
    
    public Vector listarElemento(String nombre,String tabla,String []atributos){
    	Vector <Vector<String>>usuarios=listarVector(tabla,atributos);
    	Vector <String> resultado=null;
    	while(!usuarios.isEmpty()&&resultado==null){
    		
    		if(usuarios.get(0).get(0).equals(nombre)){    			
    			resultado=usuarios.get(0);
    		}
    		usuarios.remove(0);
    	}
    	return resultado;    	
    }
    
    public Vector listarAdmins(String columnas[]){
    	return listarVector("admins",columnas);
    }
    
    public Vector listarTodosUsuarios(){
    	return listarUsuarios(attrUsuarios);
    }
    
    public Vector listarTodosAdmins(){
    	return listarAdmins(attrAdmins);
    }
    
    
    
    private Vector listarVector(String tabla,String columnas[]) 	{    	
    	Vector<Object>v= agente.select(tabla, columnas);
    	
    	return v;
    	
    }
  
    
    public void inicializarSistema(){
    	
    	String atributosUsuario="nombre varchar(20) not null,"
    			+ "apellido1 varchar(20),"
    			+ "apellido2 varchar(20),"
    			+ "pass varchar(20) not null,"    			
    			+ "direccion varchar(20),"
    			+ "localidad varchar(20),"
    			+ "pais varchar(20),"
    			+ "id INT NOT NULL AUTO_INCREMENT,"    			
    			+ "PRIMARY KEY (id)";
    	
    	String atributosAdmin="nombre varchar(20) not null,"
    			+ "pass varchar(20) not null,"
    			+ "id int not null auto_increment,"
    			+ "primary key(id)";
    	
    	if(!estaInicializado()){
    		
    	
    		crearTabla("usuarios",atributosUsuario);
    	
    		crearTabla("admins",atributosAdmin);
    		
    		configurarAdmins();
    		

    	}
    	
    }
    
    private void configurarAdmins(){
		String []att={null,claveAdmins,null};
		for(String i:admins){
			att[0]=i;
			insertarAdmins(att);
		}    	
    }
    
    private void crearTabla(String nombreTabla,String atributos){
    	/*Atributos es:
		 * 	(atributo1  tipo, atrib tipo2...primarykey..not null..) sin parentesis
		 * 
		 *  (atributoi tipo,)*(atributoi tipo)[primarykey(atributo),not null...]
		 */
    	boolean estado=true;
    	String SQL="create table "+nombreTabla+" ("+atributos+");";
    	
		agente.ejecutar(SQL);
		
			// TODO Auto-generated catch block

		
    }
    
    public boolean estaInicializado(){
    	
    	
    	return !agente.tablas().isEmpty();
    	
    }
    
    
    
    
    
}

